/*
* 1.参数是一个可迭代对象
* 2.返回值是一个Promise
* 3.当有一个失败这个Promise失败
* */

Promise._all = function (iterableObject) {
  if (iterableObject === undefined || iterableObject === null || typeof iterableObject[Symbol.iterator] !== "function") {
    new TypeError(`${iterableObject} is not iterable`);
  }

  iterableObject = [...iterableObject]
  const length = iterableObject.length;
  let count = 0;
  const result = []
  return new Promise((resolve, reject) => {
    iterableObject.forEach(async (p, index) => {
      try {
        result[index] = await p
        count++
        if (count === length) {
          resolve(result)
        }

      } catch (e) {
        reject(e);
      }
    })
  })

}


// Promise._all([1,2,3]).then(values => {
//   console.log(values)
// })
//
// Promise.all([1,2,3]).then(values => {
//   console.log(values)
// })
//
// Promise.all('hello world').then(values => {
//   console.log(values)
// })
//
// Promise._all('hello world').then(values => {
//   console.log(values)
// })

// const p1 = Promise.resolve(1)
// const p2 = Promise.resolve(2)
// const p3 = Promise.resolve(3)

// const p1 = new Promise((resolve, reject) => {
//   setTimeout(()=>{
//     resolve(1)
//   },2000)
// })
// const p2 = new Promise((resolve, reject) => {
//   setTimeout(()=>{
//     resolve(2)
//   },3000)
// })
// const p3 = new Promise((resolve, reject) => {
//   setTimeout(()=>{
//     resolve(3)
//   },1000)
// })
//
// Promise.all([p1,p2,p3]).then(values => {
//   console.log(values)
// })
// Promise._all([p1,p2,p3]).then(values => {
//   console.log(values)
// })

// const p1 = new Promise((resolve, reject) => {
//   setTimeout(()=>{
//     resolve(1)
//   },2000)
// })
// const p2 = new Promise((resolve, reject) => {
//   setTimeout(()=>{
//     resolve(2)
//   },3000)
// })
// const p3 = new Promise((resolve, reject) => {
//   setTimeout(()=>{
//     reject('error')
//   },1000)
// })
//
// Promise.all([p1,p2,p3]).then(values => {
//   console.log(values)
// }).catch(error => {
//   console.log(error)
// })
// Promise._all([p1,p2,p3]).then(values => {
//   console.log(values)
// }).catch(error => {
//   console.log(error)
// })

